﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CMS_GYM.Interface
{
    public partial class frmQuanLyCongNo : frmTemplete1
    {
        clsCongNoCauLongBUS CongNoCauLongBUS = new clsCongNoCauLongBUS();
        DataTable dtCongNoCauLong = new DataTable();
        DataView dvCongNoCauLong = new DataView();
        DataTable dtCongNoCauLongThangHienHanh = new DataTable();
        clsCongNoCauLongDTO CongNoDTO;
        int IDCongNoCanXoa = 0;
        bool TrangThaiCongNoCanXoa = false;

        #region Initial
        public frmQuanLyCongNo()
        {
            InitializeComponent();
            lblTitle.Text = "QUẢN LÝ CÔNG NỢ";
            uct_Delete.Delete.Click += new EventHandler(btn_Delete_Click);
            uct_Refresh.Refresh.Click += new EventHandler(btn_Refresh_Click);
            uct_Close.Close.Click += new EventHandler(btn_Close_Click);
            uct_Save.Save.Click += new EventHandler(btn_Save_Click);
            LoadData();
        }
        #endregion

        #region Functions
        
        private void SetPermission()
        {
            btnTaoDuLieuCongNo.Enabled = clsUser.LayThongTinPhanQuyen("QuanLyCongNo").ChucNang.Them;
            uct_Save.Enabled = clsUser.LayThongTinPhanQuyen("QuanLyCongNo").ChucNang.Sua;
            uct_Delete.Enabled = clsUser.LayThongTinPhanQuyen("QuanLyCongNo").ChucNang.Xoa;
        }

        #region CountNumberOfWeekDayInDateRange(DayOfWeek day, DateTime start, DateTime end)
        public int CountNumberOfWeekDayInDateRange(DayOfWeek day, DateTime start, DateTime end)
        {
            TimeSpan ts = end - start;                       // Total duration
            int count = (int)Math.Floor(ts.TotalDays / 7);   // Number of whole weeks
            int remainder = (int)(ts.TotalDays % 7);         // Number of remaining days
            int sinceLastDay = (int)(end.DayOfWeek - day);   // Number of days since last [day]
            if (sinceLastDay < 0) sinceLastDay += 7;         // Adjust for negative days since last [day]
            // If the days in excess of an even week are greater than or equal to the number days since the last [day], then count this one, too.
            if (remainder >= sinceLastDay) count++;
            return count;
        }
        #endregion

        #region LoadData()
        public void LoadData()
        {
            txtNam.Text = DateTime.Now.Year.ToString();
        }
        #endregion

        #endregion

        #region Events

        #region btn_Save_Click(object sender, EventArgs e)
        private void btn_Save_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("Xác nhận cập nhật dữ liệu?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    double TienNoMoi = 0;
                    if (!double.TryParse(txtCongNoMoi.Text,out TienNoMoi))
                    {
                        MessageBox.Show("Vui lòng kiểm tra số tiền công nợ mới.", "Thông báo");
                        return;
                    }
                    CongNoDTO.SoTien = TienNoMoi;
                    int i = CongNoCauLongBUS.Sua(CongNoDTO);
                    if (i == 1)
                    {
                        MessageBox.Show("Cập nhật dữ liệu thành công", "Thông báo");
                        pnlCapNhatCongNo.Visible = false;
                        btn_Refresh_Click(sender,e);
                    }
                    else
                        MessageBox.Show("Lỗi cập nhật dữ liệu", "Thông báo");
                    //LoadData();
                }
            }
            catch { MessageBox.Show("Lỗi cập nhật dữ liệu", "Thông báo"); }
           
        }
        #endregion

        #region btn_Close_Click(object sender, EventArgs e)
        private void btn_Close_Click(object sender, EventArgs e)
        {
            this.pnlCapNhatCongNo.Visible = false;
        }
        #endregion

        #region btn_Delete_Click(object sender, EventArgs e)
        private void btn_Delete_Click(object sender, EventArgs e)
        {
            try
            {
                if (TrangThaiCongNoCanXoa == true)
                {
                    MessageBox.Show("Không được phép xóa dữ liệu công nợ đã thu.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (MessageBox.Show("Xác nhận xóa dữ liệu công nợ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    int i = CongNoCauLongBUS.Xoa(IDCongNoCanXoa);
                    if (i == 1)
                    {
                        MessageBox.Show("Xóa dữ liệu thành công", "Thông báo");
                        btn_Refresh_Click(sender, e);
                    }
                    else
                        MessageBox.Show("Lỗi xóa dữ liệu công nợ.", "Thông báo");
                    //LoadData();
                }
            }
            catch { MessageBox.Show("Lỗi xóa dữ liệu công nợ.", "Thông báo"); }
        }
        #endregion

        #region btn_Refresh_Click(object sender, EventArgs e)
        private void btn_Refresh_Click(object sender, EventArgs e)
        {
            try
            {
                LoadData();
                int Thang, Nam;
                if (!int.TryParse(cboThang.Text, out Thang))
                {
                    MessageBox.Show("Kiểm tra dữ liệu tháng/năm!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (!int.TryParse(txtNam.Text.Trim(), out Nam))
                {
                    MessageBox.Show("Kiểm tra dữ liệu tháng/năm!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                dtg_Data.Rows.Clear();
                dtCongNoCauLong = CongNoCauLongBUS.LayBangCongNoTheoThangNam(Thang, Nam);
                if (dtCongNoCauLong.Rows.Count == 0)
                {
                    MessageBox.Show("Không tìm thấy dữ liệu công nợ của Tháng " + cboThang.Text + "/" + txtNam.Text, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                dvCongNoCauLong = new DataView(dtCongNoCauLong);
                foreach (DataRow dr in dtCongNoCauLong.Rows)
                {
                    string strTrangThai = dr["TrangThaiGachNo"].ToString().ToUpper() == "TRUE" ? "Đã thu" : "Chưa thu";
                    dtg_Data.Rows.Add(new object[] { dr["CongNoId"], dr["KhachHangId"]
                    , dr["MaKhachHang"], dr["HoTen"], String.Format("{0:0,0}", dr["SoTien"]) 
                    , dr["Thang"], dr["Nam"]
                    , dr["SoTienThu"], dr["PhieuThuId"], dr["SoPhieuThu"], dr["KyHieu"], dr["TrangThaiGachNo"], strTrangThai });
                }
            }
            catch 
            {
                MessageBox.Show("Dữ liệu công nợ chưa tồn tại.", "Thông báo");
            }
        }
        #endregion

        #region btnTaoDuLieuCongNo_Click(object sender, EventArgs e)
        private void btnTaoDuLieuCongNo_Click(object sender, EventArgs e)
        {
            try
            {
                int CurrentYear = DateTime.Now.Year;
                int CurrentMonth = 0;
                if (!int.TryParse(cboThang.Text,out CurrentMonth))
                {
                    MessageBox.Show("Kiểm tra dữ liệu tháng/năm của công nợ", "Thông báo");
                    return;
                }
                //if (!int.TryParse(txtNam.Text.Trim(), out CurrentYear))
                //{
                //    MessageBox.Show("Kiểm tra dữ liệu tháng/năm của công nợ", "Thông báo");
                //    return;
                //}
                CurrentMonth = int.Parse(cboThang.Text);
                int CurrentDay = DateTime.Now.Day;
                System.Windows.Forms.DialogResult result = MessageBox.Show("Xác nhận tính công nợ tiền thuê sân cầu cho tháng " 
                    + CurrentMonth.ToString() + "/" + txtNam.Text.Trim() + "?"
                    , "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == System.Windows.Forms.DialogResult.No) return;
                DataView dvCongNoThang = new DataView(dtCongNoCauLong);
                dvCongNoThang.RowFilter = "Thang = " + CurrentMonth.ToString() + " and Nam = " + txtNam.Text.Trim();
                List<clsCongNoCauLongDTO> dsCongNoDaThu = new List<clsCongNoCauLongDTO>();

                if (dvCongNoThang.Table.Rows.Count > 0)
                {
                    DialogResult dialogResult =
                    MessageBox.Show("Dữ liệu công nợ cho tháng "
                    + CurrentMonth.ToString() + "/" + txtNam.Text.Trim() + " đã tồn tại."
                    +"\nVui lòng xác nhận xóa dữ liệu vào tạo lại công nợ?"
                    + "\n\nLƯU Ý: CHƯƠNG TRÌNH CHỈ XÓA NHỮNG DÒNG CÔNG NỢ CÓ TRẠNG THÁI CHƯA THU"
                    , "Thông báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                    if (dialogResult == DialogResult.Cancel) return;
                    DataTable CongNoThang = dvCongNoThang.ToTable();
                    //List<clsCongNoCauLongDTO> dsCongNoDaThu = new List<clsCongNoCauLongDTO>();
                    foreach (DataRow dr in CongNoThang.Rows)
                    {
                        bool TrangThaiThu = bool.Parse(dr["TrangThaiGachNo"].ToString());
                        if (TrangThaiThu == false)
                        {
                            int ID_CongNo = int.Parse(dr["CongNoId"].ToString());
                            CongNoCauLongBUS.Xoa(ID_CongNo);
                        }
                        else
                        {
                            clsCongNoCauLongDTO CongNoDaThu = new clsCongNoCauLongDTO();
                            CongNoDaThu.CongNoId = int.Parse(dr["CongNoId"].ToString());
                            CongNoDaThu.KhachHangId = int.Parse(dr["KhachHangId"].ToString());
                            CongNoDTO.HoTen = dr["HoTen"].ToString();
                            CongNoDaThu.SoTien = double.Parse(dr["SoTien"].ToString());
                            CongNoDaThu.Thang = int.Parse(dr["Thang"].ToString());
                            CongNoDaThu.Nam = int.Parse(dr["Nam"].ToString());
                            dsCongNoDaThu.Add(CongNoDaThu);
                        }

                    }   
                }

                clsLichChiTietBUS LichChiTietBUS = new clsLichChiTietBUS();
                DataTable dtTemp = LichChiTietBUS.LayBangThongBaoTienSanHangThang();
                #region xac dinh ngay cuoi thang
                int EndDayOfMonth = 0;
                switch (CurrentMonth)
                {
                    case 1:
                        EndDayOfMonth = 31;
                        break;
                    case 2:
                        EndDayOfMonth = 28;
                        break;
                    case 3:
                        EndDayOfMonth = 31;
                        break;
                    case 4:
                        EndDayOfMonth = 30;
                        break;
                    case 5:
                        EndDayOfMonth = 31;
                        break;
                    case 6:
                        EndDayOfMonth = 30;
                        break;
                    case 7:
                        EndDayOfMonth = 31;
                        break;
                    case 8:
                        EndDayOfMonth = 31;
                        break;
                    case 9:
                        EndDayOfMonth = 30;
                        break;
                    case 10:
                        EndDayOfMonth = 31;
                        break;
                    case 11:
                        EndDayOfMonth = 30;
                        break;
                    case 12:
                        EndDayOfMonth = 31;
                        break;
                }
                #endregion
                double TongTienTheoKhachHangId = 0;
                DataView dv = new DataView(dtTemp);
                DataTable KhachHangTienSanTable = dv.ToTable(true, "KhachHangId", "MaKhachHang", "HoTen");
                KhachHangTienSanTable.Columns.Add("SoTien", typeof(double));

                DateTime dtNgayDauThang = new DateTime(CurrentYear, CurrentMonth, 1);
                DateTime dtNgayCuoiThang = new DateTime(CurrentYear, CurrentMonth, EndDayOfMonth);
                foreach (DataRow dr in KhachHangTienSanTable.Rows)
                {
                    dv.RowFilter = "KhachHangId=" + dr["KhachHangId"].ToString();
                    DataTable tableFromView = dv.ToTable();
                    for (int i = 0; i < tableFromView.Rows.Count; i++)
                    {
                       int countDay = 0;
                        #region Dem so ngay cua cac Thu 2,3,4,5,6,7,CN trong thang
                        switch (tableFromView.Rows[i]["TenNgayTrongTuan"].ToString().ToLower())
                        {
                            case "thứ hai":
                                countDay = CountNumberOfWeekDayInDateRange(DayOfWeek.Monday, dtNgayDauThang, dtNgayCuoiThang);
                                break;
                            case "thứ ba":
                                countDay = CountNumberOfWeekDayInDateRange(DayOfWeek.Tuesday, dtNgayDauThang, dtNgayCuoiThang);
                                break;
                            case "thứ tư":
                                countDay = CountNumberOfWeekDayInDateRange(DayOfWeek.Wednesday, dtNgayDauThang, dtNgayCuoiThang);
                                break;
                            case "thứ năm":
                                countDay = CountNumberOfWeekDayInDateRange(DayOfWeek.Thursday, dtNgayDauThang, dtNgayCuoiThang);
                                break;
                            case "thứ sáu":
                                countDay = CountNumberOfWeekDayInDateRange(DayOfWeek.Friday, dtNgayDauThang, dtNgayCuoiThang);
                                break;
                            case "thứ bảy":
                                countDay = CountNumberOfWeekDayInDateRange(DayOfWeek.Saturday, dtNgayDauThang, dtNgayCuoiThang);
                                break;
                            case "chủ nhật":
                                countDay = CountNumberOfWeekDayInDateRange(DayOfWeek.Sunday, dtNgayDauThang, dtNgayCuoiThang);
                                break;
                        }
                        #endregion
                        string[] BatDau = tableFromView.Rows[i]["GioBatDau"].ToString().Split(':');
                        string[] KetThuc = tableFromView.Rows[i]["GioKetThuc"].ToString().Split(':');
                        DateTime dtBatDau = new DateTime(1, 1, 1, int.Parse(BatDau[0]), int.Parse(BatDau[1]), int.Parse(BatDau[2]));
                        DateTime dtKetThuc = new DateTime(1, 1, 1, int.Parse(KetThuc[0]), int.Parse(KetThuc[1]), int.Parse(KetThuc[2]));
                        TimeSpan ts = dtKetThuc.Subtract(dtBatDau);
                        double TongTien = ts.TotalHours * double.Parse(tableFromView.Rows[i]["GiaTien"].ToString()) * countDay;
                        TongTienTheoKhachHangId += TongTien;
                    }
                    dr["SoTien"] = TongTienTheoKhachHangId;
                    TongTienTheoKhachHangId = 0;
                    dv.RowFilter = string.Empty;
                }
                #region Ghi du lieu vao bang Cong no cau long
                try
                {
                    clsCongNoCauLongBUS CongNoBUS = new clsCongNoCauLongBUS();
                    foreach (DataRow dr in KhachHangTienSanTable.Rows)
                    {
                        if (dr["MaKhachHang"].ToString().ToUpper().Contains("CLVL"))
                            continue;

                        clsCongNoCauLongDTO CongNoDTO = new clsCongNoCauLongDTO();
                        CongNoDTO.KhachHangId = int.Parse(dr["KhachHangId"].ToString());
                        CongNoDTO.HoTen = dr["HoTen"].ToString();
                        CongNoDTO.SoTien = double.Parse(dr["SoTien"].ToString());
                        CongNoDTO.Thang = CurrentMonth;
                        CongNoDTO.Nam = CurrentYear;
                        CongNoDTO.TrangThaiGachNo = 0;
                        bool FlagCongNoDaDaThu = false;
                        for (int i = 0; i < dsCongNoDaThu.Count; i++)
                        {
                            if(CongNoDTO.KhachHangId == dsCongNoDaThu[i].KhachHangId
                                && CongNoDTO.SoTien == dsCongNoDaThu[i].SoTien
                                && CongNoDTO.Thang == dsCongNoDaThu[i].Thang
                                && CongNoDTO.Nam == dsCongNoDaThu[i].Nam)
                            {
                                FlagCongNoDaDaThu = true;
                                break;
                            }
                        }
                        if (!FlagCongNoDaDaThu)
                        {
                            if (CongNoBUS.Them(CongNoDTO) == -1)
                            {
                                MessageBox.Show("Lỗi thêm dữ liệu công nợ <<KH " + dr["KhachHangId"].ToString() + ">>", "Thông báo");
                            }
                        }
                    }
                    MessageBox.Show("Thêm dữ liệu công nợ tháng " + CurrentMonth.ToString() + "/" + CurrentYear.ToString() + " thành công."
                        , "Thông báo");
                }
                catch { }
                #endregion
            }
            catch { }
        }
        #endregion

        #region dtg_Data_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        private void dtg_Data_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                string IDCongNo = dtCongNoCauLong.Rows[e.RowIndex]["CongNoId"].ToString();
                bool TrangThai = bool.Parse(dtCongNoCauLong.Rows[e.RowIndex]["TrangThaiGachNo"].ToString());
                if (TrangThai == true)
                {
                    MessageBox.Show("Công nợ đã được thu. Không được phép chỉnh sửa.", "Thông báo");
                    return;
                }
                this.pnlCapNhatCongNo.Visible = true;
                dvCongNoCauLong.RowFilter = "CongNoId = " + IDCongNo;
                DataTable dtCongNoKhachHang = dvCongNoCauLong.ToTable();
                txtHoTen.Text = dtCongNoKhachHang.Rows[0]["HoTen"].ToString();
                txtCongNoThang.Text = dtCongNoKhachHang.Rows[0]["Thang"].ToString() + "/" + dtCongNoCauLong.Rows[0]["Nam"].ToString();
                txtSoTienCu.Text = String.Format("{0:0,0}", dtCongNoKhachHang.Rows[0]["SoTien"]);
                txtCongNoMoi.Text = string.Empty;
                txtCongNoMoi.Focus();
                CongNoDTO = new clsCongNoCauLongDTO();
                CongNoDTO.CongNoId = int.Parse(IDCongNo);
                CongNoDTO.HoTen = dtCongNoKhachHang.Rows[0]["HoTen"].ToString();
                CongNoDTO.KhachHangId = int.Parse(dtCongNoKhachHang.Rows[0]["KhachHangId"].ToString());
                CongNoDTO.Nam = int.Parse(dtCongNoKhachHang.Rows[0]["Nam"].ToString());
                CongNoDTO.Thang = int.Parse(dtCongNoKhachHang.Rows[0]["Thang"].ToString());
                CongNoDTO.SoTien = double.Parse(dtCongNoKhachHang.Rows[0]["SoTien"].ToString());
                CongNoDTO.TrangThaiGachNo = 0;
                //CongNoDTO.PhieuThuId = int.Parse(dtCongNoKhachHang.Rows[0]["PhieuThuId"].ToString());
                //CongNoDTO.SoTienThu = double.Parse(dtCongNoKhachHang.Rows[0]["SoTienThu"].ToString());                
            }
            catch { }
        }
        #endregion

        #region dtg_Data_RowEnter(object sender, DataGridViewCellEventArgs e)
        private void dtg_Data_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                IDCongNoCanXoa = int.Parse(dtCongNoCauLong.Rows[e.RowIndex]["CongNoId"].ToString());
                TrangThaiCongNoCanXoa = bool.Parse(dtCongNoCauLong.Rows[e.RowIndex]["TrangThaiGachNo"].ToString());
            }
            catch { }
        }
        #endregion

        private void frmQuanLyCongNo_Load(object sender, EventArgs e)
        {
            try
            {
                SetPermission();
            }
            catch { }
        }

        #endregion
    }
}
